#include "includes.h"
#include "usart1.h"
#include "usart2.h"
#include "usart3.h"
#include "usart4.h"
#include "usart5.h"

#include "queue.h"
#include "xrj_protocol.h"
#include "IOdevice.h"
#include "ICcard.h"	

#include "I2c_lkt4106.h"
#include "lm75a.h"



//const char Vesion2Flash[256] __attribute__((at(0x8040000-256))) = {  	
//	's','o','f','t','w','a','r','e',':', 
//	((SOFTWARE_VESION&0xf000)>>12)+0x30,((SOFTWARE_VESION&0x0f00)>>8)+0x30,'.',((SOFTWARE_VESION&0x00f0)>>4)+0x30,((SOFTWARE_VESION&0x000f)>>0)+0x30,',',
//	'h','a','r','d','w','a','r','e',':', 
//	((HAREWARE_VESION&0xf000)>>12)+0x30,((HAREWARE_VESION&0x0f00)>>8)+0x30,'.',((HAREWARE_VESION&0x00f0)>>4)+0x30,((HAREWARE_VESION&0x000f)>>0)+0x30,',',
//	'b','u','i','l','d',':',
//	YEAR_0,YEAR_1,YEAR_2,YEAR_3,
//	MONTH_0,MONTH_1,
//	DAY_0,DAY_1,
//	TIME_0,TIME_1,TIME_2,TIME_3,
//	0,	
//};







/////////////////////////UCOSII任务设置///////////////////////////////////
//START 任务
//设置任务优先级
#define START_TASK_PRIO      			2 //开始任务的优先级设置为最低
//设置任务堆栈大小
#define START_STK_SIZE  				(256)
//任务堆栈	
OS_STK START_TASK_STK[START_STK_SIZE];
//任务函数
void start_task(void *pdata);	
 			   
				 
	

//MQTT任务
//任务优先级
#define Protobuf_TASK_PRIO		(OS_TASK_TMR_PRIO + 21)
//任务堆栈大小
#define Protobuf_STK_SIZE		(1024)
//任务堆栈
OS_STK	Protobuf_TASK_STK[Protobuf_STK_SIZE];

//任务函数
void Protobuf_task(void *pdata);



#define	IOdevice_TASK_PRIO		(OS_TASK_TMR_PRIO + 22)
#define IOdevice_STK_SIZE		(512)
__align(8) OS_STK	IOdevice_TASK_STK[IOdevice_STK_SIZE];
void IOdevice_task(void *pdata);



/*
// Loop_任务
//任务优先级
#define ICCARD_TASK_PRIO		56
//任务堆栈大小
#define ICCARD_STK_SIZE		512
//任务堆栈
OS_STK	ICCARD_TASK_STK[ICCARD_STK_SIZE];

//任务函数
void ICCARD_Task(void *pdata); 
*/

//任务优先级
#define Ultrasonic_TASK_PRIO		56
//任务堆栈大小
#define Ultrasonic_STK_SIZE		512
//任务堆栈
OS_STK	Ultrasonic_TASK_STK[Ultrasonic_STK_SIZE];
void Ultrasonic_Task(void *pdata);
	

//RCC时钟设置
void RCC_config(void)  
{
    RCC_DeInit();
    /* Enable HSE */
    RCC_HSEConfig(RCC_HSE_ON);

    /* Wait till HSE is ready */

    if(RCC_WaitForHSEStartUp())
    {
        /* Enable Prefetch Buffer */
        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

        /* Flash 2 wait state */
        FLASH_SetLatency(FLASH_Latency_2);
    
        /* HCLK = SYSCLK */
        RCC_HCLKConfig(RCC_SYSCLK_Div1); 
  
        /* PCLK2 = HCLK */
        RCC_PCLK2Config(RCC_HCLK_Div1); 
 
        /* PCLK1 = HCLK/2 */
        RCC_PCLK1Config(RCC_HCLK_Div2);
 
        /* PLLCLK = 8MHz * 9 = 72 MHz */
        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);   //RCC_PLLMul_9
 
        /* Enable PLL */ 
        RCC_PLLCmd(ENABLE);
 
        /* Wait till PLL is ready */
        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
        {
        }
 
        /* Select PLL as system clock source */
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
 
        /* Wait till PLL is used as system clock source */
        while(RCC_GetSYSCLKSource() != 0x08)
        {
        }
    }
}


/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
** 函数名称: Init_NVIC
** 功能描述: 系统中断配置
** 参数描述：无
** 作  　者: Dream
** 日　  期: 2011年6月20日
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
void Init_NVIC(void)
{ 
//	NVIC_InitTypeDef  NVIC_InitStructure;
	 	
//	#ifdef  VECT_TAB_RAM  							//向量表基地址选择
//	  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);  	//将0x20000000地址作为向量表基地址(RAM)
//	#else  
//	  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x3000); //将0x08002000地址作为向量表基地址(FLASH)  
//	#endif
	
	NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8000); 
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级，2位响应优先?


}

void Hardware_Init(void)
{
	CLI();                               // Disable Interrupts
	RCC_config(); 
//---重定向中断向量表注册函数	
//	SCB->VTOR = FLASH_BASE | 0x3000; /* Vector Table Relocation in Internal FLASH. */
	Init_NVIC();				//中断向量表注册函数	
	
	
	delay_init();	    	//延时函数初始化	 
	delay_ms(1000); 
	
	CreateQueue_Frame(&Queue_Frame_Usart2, sizeof(USART2_Queue_Buf), USART2_Queue_Buf ,DMA_UART2_TX_Buf,DMA_UART2_RX_Buf);
	CreateQueue_Frame(&Queue_Frame_Usart3, sizeof(USART3_Queue_Buf), USART3_Queue_Buf ,DMA_UART3_TX_Buf,DMA_UART3_RX_Buf);

	
 
	usart1_init(9600);
	usart2_init(115200);
	usart3_init(19200);		//初始化串口3 
	//usart4_init(9600);	
	usart5_init(19200);
	

	LKT4106_Init();
	
	LM75A_Init();
//	Sys_InitParameter();
	SEI();
//	printf("TEST OK\r\n");
//	W25QXX_Read(W25QXX_BUFFER,W25QXX_SECPOS,W25QXX_SECPOS); 
//	W25QXX_Erase_Chip();
/*	while(1)
	{
		USART2_OUT("hello world\n");
		USART3_OUT("hello world\n");
		u5_printf("hello world\n");
	}*/
	IWDG_Init(IWDG_Prescaler_128,500);

	W25QXX_Init();	
	
//	printf("Rubbish  SOFTWARE:V%d.%d,HAREWARE:V%d.%d,build:%s %s \n",(SOFTWARE_VESION/256),(SOFTWARE_VESION%256),
//																			   (HAREWARE_VESION/256),(HAREWARE_VESION%256),__DATE__,__TIME__);
	printf("Rubbish %s",Version2Flash);
}


int main(void)
{	 
		Hardware_Init();
		SWITCH_Key_Init();
		LED_Init();
		MOTOR_Init();
		FAN_Init();
		LOCK_Init();
		BEEP_Init();

		OSInit(); 
		OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//创建起始任务
		OSStart();	  	 
}
  
//开始任务
void start_task(void *pdata)
{
    OS_CPU_SR cpu_sr=0;
	pdata = pdata; 	

	OS_ENTER_CRITICAL();			//进入临界区(无法被中断打断)    
	USART1_Create_Sem();
	USART2_Create_Sem();
	USART3_Create_Sem();
	USART4_Create_Sem();
	USART5_Create_Sem();
	
	MTD_SPI_Set_Init();
	ProtoTxRx_Create_Sem();
	OSTaskCreate(Protobuf_task,(void*)0,(OS_STK*)&Protobuf_TASK_STK[Protobuf_STK_SIZE-1],Protobuf_TASK_PRIO); //mqtt task	
	OSTaskCreate(IOdevice_task,(void*)0,(OS_STK*)&IOdevice_TASK_STK[IOdevice_STK_SIZE-1],IOdevice_TASK_PRIO);	
	OSTaskCreate(Ultrasonic_Task,(void*)0,(OS_STK*)&Ultrasonic_TASK_STK[Ultrasonic_STK_SIZE-1],Ultrasonic_TASK_PRIO);	
	OS_EXIT_CRITICAL();				//退出临界区(可以被中断打断)

	while(1)
	{
	//		IWDG_Feed();	
		OSTimeDlyHMSM (0,0,0,16);	
	}	
}












